package com.lap.analysis.processor;

import com.lap.analysis.source.entity.ClassInfo;
import com.lap.analysis.source.entity.FileInfo;
import com.lap.analysis.env.builder.EnvBuilder;
import com.lap.analysis.env.entity.Environment;
import com.lap.analysis.env.builder.EnvDirector;
import com.lap.analysis.file.handler.FileContext;
import com.lap.analysis.source.builder.SourceBuilder;
import com.lap.analysis.source.builder.SourceDirector;
import com.lap.analysis.tools.PropUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang3.StringUtils;

import java.io.File;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.List;
import java.util.Properties;

/**
 * 文件执行过程
 *
 * @author Shuisheng Lao(劳水生)
 * @version 0.0.1
 */
@Slf4j
public class FileProcessor {

  /**
   *
   *
   * <pre>
   * 生成测试代码文件,默认配置文件:
   * src/test/resources/test-config.xml
   * </pre>
   */
  public void execute() {
    execute(null);
  }

  /**
   * 生成测试代码文件
   *
   * @param configFile 文件配置
   */
  public void execute(String configFile) {
    List<FileInfo> infoList = getFiles(configFile);
    writeFile(infoList);
  }

  /**
   *
   *
   * <pre>
   * 根据默认配置文件获取测试文件,默认配置文件地址:
   * src/test/resources/test-config.xml
   * </pre>
   *
   * @return 文件集合
   */
  public List<FileInfo> getFiles() {
    return getFiles(null);
  }

  /**
   * 根据测试配置文件获取测试代码文件
   *
   * @param configFile 配置文件
   * @return 文件集合
   */
  public List<FileInfo> getFiles(String configFile) {
    Properties prop =
        StringUtils.isNotBlank(configFile) ? PropUtil.getProp(configFile) : PropUtil.getProp();

    EnvBuilder envBuilder = new EnvBuilder.Default();
    EnvDirector envDirector = new EnvDirector(envBuilder);
    Environment env = envDirector.construct(prop);

    SourceBuilder sourceBuilder = new SourceBuilder.Default();
    SourceDirector sourceDirector = new SourceDirector(sourceBuilder);
    List<ClassInfo> classInfoList = sourceDirector.construct(env);

    FileContext delegate = new FileContext();
    return delegate.execute(classInfoList);
  }

  /**
   * 写入测试文件
   *
   * @param fileInfoList 文件集合
   */
  public void writeFile(List<FileInfo> fileInfoList) {
    if (CollectionUtils.isEmpty(fileInfoList)) return;

    fileInfoList.stream()
        .forEach(
            item -> {
              File writeFile = new File(item.getPath() + item.getFileName());

              if (!writeFile.getParentFile().exists()) // 如果文件的目录不存在
              writeFile.getParentFile().mkdirs(); // 创建目录

              if (!writeFile.exists()) {
                log.info("{}", writeFile.getName());
                try {
                  FileUtils.writeStringToFile(writeFile, item.getContent(), StandardCharsets.UTF_8);
                } catch (IOException e) {
                  log.warn(e.getLocalizedMessage(), e);
                }
              }
            });
  }
}
